#pragma once
#include <iostream>

/**
 * @brief 定义了一个打印接口，要求实现类提供 Print 方法。
 */
class IPrinter
{
public:
	virtual void Print() = 0;
};

/**
 * @brief 实现 IPrinter 接口的简单打印机类。
 */
class SimplePrinter : public IPrinter
{
public:
	void Print() override
	{
		std::cout << "正在打印文档..." << std::endl;
	}
};

/**
 * @brief 定义了一个抽象的扫描器接口类，要求实现扫描操作。
 */
class IScanner
{
public:
	virtual void Scan() = 0;
};

/**
 * @brief 实现了IScanner接口的简单扫描器类，用于扫描文档。
 */
class SimpleScanner : public IScanner
{
public:
	void Scan() override
	{
		std::cout << "正在扫描文档..." << std::endl;
	}
};

/**
 * @brief 定义一个传真接口类，要求实现传真功能。
 */
class IFax
{
public:
	virtual void Fax() = 0;
};

/**
 * @brief 实现 IFax 接口的简单传真类。
 */
class SimpleFax : public IFax
{
public:
	void Fax() override
	{
		std::cout << "正在发送传真..." << std::endl;
	}
};

/**
 * @brief IMachine 类继承自 IPrinter、IFax 和 IScanner 接口，表示一个多功能设备，具备打印、传真和扫描功能。
 */
class IMachine : public IPrinter , public IFax ,public IScanner
{
};

/**
 * @brief 实现了 IMachine 接口的多功能设备类，通过组合 IPrinter、IFax 和 IScanner 实现打印、传真和扫描功能。
 */
class Machine : public IMachine
{
public:
	Machine(IPrinter& painter, IFax& fax, IScanner& scan) 
		:_painter(painter) , _fax(fax), _scan(scan)
	{}

	void Print() override
	{
		_painter.Print();
	}

	void Fax() override
	{
		_fax.Fax();
	}

	void Scan() override
	{
		_scan.Scan();
	}
private:
	IPrinter& _painter;
	IFax& _fax;
	IScanner& _scan;
};
